package com.common.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
 * @className: SystemTool
 * @description: 与系统相关的一些常用工具方法. 目前实现的有：获取MAC地址、IP地址、主机名
 * @author: 笑遍世界
 * @createTime: 2010-11-13 下午08:03:44
 */
public class WindowsUtil {

    /**
     * 获取当前操作系统名称.
     * return 操作系统名称 例如:windows xp,linux 等.
     */
    private static String getOSName() {
        return System.getProperty("os.name").toLowerCase();
    }

    /**
     * 获取unix网卡的mac地址.
     * 非windows的系统默认调用本方法获取.如果有特殊系统请继续扩充新的取mac地址方法.
     *
     * @return mac地址
     */
    private static String getUnixMACAddress() {
        String mac = null;
        BufferedReader bufferedReader = null;
        Process process;
        try {
            process = Runtime.getRuntime().exec("ifconfig eth0");// linux下的命令，一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
            bufferedReader = new BufferedReader(new InputStreamReader(process
                    .getInputStream()));
            String line;
            int index;
            while ((line = bufferedReader.readLine()) != null) {
                index = line.toLowerCase().indexOf("hwaddr");// 寻找标示字符串[hwaddr]
                if (index >= 0) {// 找到了
                    mac = line.substring(index + "hwaddr".length() + 1).trim();//  取出mac地址并去除2边空格
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }

        return mac;
    }

    /**
     * 获取widnows网卡的mac地址.
     *
     * @return mac地址
     */
    private static List<String> getWindowsMACAddress() {
        List<String> macList = new ArrayList<String>();
        String mac = null;
        BufferedReader bufferedReader = null;
        Process process;
        try {
            // windows下的命令，显示信息中包含有mac地址信息
            process = Runtime.getRuntime().exec("ipconfig /all");
            bufferedReader = new BufferedReader(new InputStreamReader(process
                    .getInputStream(), "GBK"));
            String line;
            int index;
            while ((line = bufferedReader.readLine()) != null) {
                index = line.toLowerCase().indexOf("physical address");// 寻找标示字符串[physical address]

                if (index == -1) {
                    index = line.indexOf("物理地址");
                }
                if (index >= 0) {// 找到了
                    index = line.indexOf(":");// 寻找":"的位置
                    if (index >= 0) {
                        mac = line.substring(index + 1).trim();//  取出mac地址并去除2边空格
                    }
                    macList.add(mac);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }

        return macList;
    }

    /**
     * @return 本机主机名
     */
    private static String getHostName() {
        InetAddress ia = null;
        try {
            ia = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        if (ia == null) {
            return "some error..";
        } else
            return ia.getHostName();
    }

    /**
     * @return 本机IP 地址
     */
    private static String getIPAddress() {
        InetAddress ia = null;
        try {
            ia = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        if (ia == null) {
            return "some error..";
        } else
            return ia.getHostAddress();
    }

    /**
     * 获取电脑的mac编码
     * @return
     */
    public static String getMacCode(){
        String os = getOSName();
        String code = "";
        if (os.contains("windows")) {
            //本地是windows
            List<String> mac = getWindowsMACAddress();
            if(mac != null && mac.size() > 0){
                code = mac.get(0);
            }
        } else {
            //本地是非windows系统 一般就是unix
            String mac = getUnixMACAddress();
            code = mac;
        }
        code = code.replaceAll("-", "");
        // E0F20C8C247855F0F8
        return code;
    }

    /**
     * 获取CPU序列号
     * @return
     * @throws IOException
     */
    public static String getCPUSerialNumber() {
        String next;
        try {
            Process process = Runtime.getRuntime().exec(new String[]{"wmic", "cpu", "get", "ProcessorId"});
            process.getOutputStream().close();
            Scanner sc = new Scanner(process.getInputStream());
            String serial = sc.next();
            next = sc.next();
        } catch (IOException e) {
            throw new RuntimeException("获取CPU序列号失败");
        }
        return next;
    }


    /**
     * 测试用的main方法.
     *
     * @param
     */
    /*public static void main(String[] argc) {
        String os = getOSName();
        System.out.println("OS Type:" + os);
        if (os.contains("windows")) {
            //本地是windows
            List<String> mac = getWindowsMACAddress();
            System.out.println("MAC Address:" + mac);
        } else {
            //本地是非windows系统 一般就是unix
            String mac = getUnixMACAddress();
            System.out.println(mac);
        }
        System.out.println("HostName:" + getHostName());
        System.out.println("IPAddress:" + getIPAddress());


        //这个更简单
        Map<String, String> map = System.getenv();
        String userName = map.get("USERNAME");// 获取用户名
        String computerName = map.get("COMPUTERNAME");// 获取计算机名
        String userDomain = map.get("USERDOMAIN");// 获取计算机域名


        System.out.println(userName);
        System.out.println(computerName);
        System.out.println(userDomain);

        System.out.println(GetMac());

        System.out.println(getMacCode());

    }*/

    public static String GetMac(String... ip) {
        List<String> macList = new ArrayList<String>();
        InetAddress ia;
        byte[] mac = null;
        try {
            //获取本地IP对象
            ia = InetAddress.getLocalHost();
            //获得网络接口对象（即网卡），并得到mac地址，mac地址存在于一个byte数组中。
            mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //下面代码是把mac地址拼装成String
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < mac.length; i++) {
            if (i != 0) {
                sb.append("-");
            }
            //mac[i] & 0xFF 是为了把byte转化为正整数
            String s = Integer.toHexString(mac[i] & 0xFF);
            sb.append(s.length() == 1 ? 0 + s : s);
        }

        //把字符串所有小写字母改为大写成为正规的mac地址并返回
        return sb.toString().toUpperCase();
    }



}